package com.test.file;

import com.itextpdf.text.pdf.PdfDocument;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfTextExtractor;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.junit.Test;

import java.io.File;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

/**
 * @author 李玄玄
 * @date 2024年08月20日 11:40
 */
public class ReadPDF {
    @Test
    public void testOne() {
        try {
            File file = new File("D:\\test.pdf");
            //File file = new File("D:\\NBT 20372-2016 压水堆核电厂反应堆控制棒驱动机构安装技术规程.pdf");
            PDDocument document = PDDocument.load(file);
            PDFTextStripper pdfStripper = new PDFTextStripper();
            //1 先把文本获取到
            String text = pdfStripper.getText(document);
            pdfStripper.setParagraphStart("\r\n");
            pdfStripper.setSortByPosition(true);
            //2 按行分割出文本
            String[] split = text.split(pdfStripper.getParagraphStart());
            document.close();//及时关闭流

            List<String> list = Arrays.asList(split);
            StringBuilder chineseBuilder = new StringBuilder();
            //3 正则匹配中文 目前适合去匹配中文文件。测试过，如果不取中文的话，一行可能由....组成的话，一行能装的字符串的长度就比较大，目标是获取一行能做最大的中文多少个
            Pattern pattern = Pattern.compile("[\u4e00-\u9fa5]+");
            //Matcher matcher = null;
            List<String> cNStrList = list.stream().map(v -> {
                Matcher matcher = pattern.matcher(v);
                while (matcher.find()) {
                    chineseBuilder.append(matcher.group());
                }
                String s = chineseBuilder.toString();
                chineseBuilder.setLength(0);
                return s;
            }).collect(Collectors.toList());
            // 4 取出最长中文行的长度
            Optional<String> longest = cNStrList.stream().max(Comparator.comparingInt(String::length));
            // 输出最长的字符串
            String maxStr = longest.get();
            int length = maxStr.length();
            double bl = 0.8; //参数可以自己优化设定！！！
            List<String> duanList = new ArrayList<>();
            String duan = "";
            // 按行处理原文
// 目前设定为，一行中，如果大于最大中文数量的0.8，则认为这段落没结束，如果下行还是大于，就继续认为属于这段，否则就认为这段要结束了。
            //这种设定依然不是很准确，但是已经可以分割出一些段落
            //这样处理是，因为目前（2024年04）合适的对PDF文件进行分割
            for (int i = 0; i < split.length; i++) {
                //System.out.println("line----" + i  + "------" + split[i]);
                if (split[i].length() >= length * bl) {
                    duan += split[i];
                    if (i < split.length) {
                        if (split[i + 1].length() >= length * bl) {

                        } else {
                            duan += split[i + 1];
                            duanList.add(duan);
                            duan = "";
                            i++;//已经处理过i+1了，所以手动+1
                        }
                    }
                } else {
                    duan = split[i];
                    duanList.add(duan);
                    duan = "";
                }
            }
            for (String s : duanList) {
                System.out.println("duan-------" + s);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Test
    public void testTwo() {
        try {
            PDDocument document = PDDocument.load(new File("D:\\NBT 20372-2016 压水堆核电厂反应堆控制棒驱动机构安装技术规程.pdf"));
            PDFTextStripper pdfStripper = new PDFTextStripper();
            pdfStripper.setSortByPosition(true);
            String text = pdfStripper.getText(document);
            System.out.println(text);
            document.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
